<?php
// Copyright 2011 Zeptonic Ek. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
//    conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
//    of conditions and the following disclaimer in the documentation and/or other materials
//    provided with the distribution.
// 
// THIS SOFTWARE IS PROVIDED BY Zeptonic Ek ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Zeptonic Ek OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// 
// The views and conclusions contained in the software and documentation are those of the 
// authors and should not be interpreted as representing official policies, 
// either expressed or implied, of Zeptonic Ek.


/**
 * Utför formning av den skrapade sidan.
 * 
 * @category  Golfscraper
 * @package   Golfscraper
 * @author    Anders Axelsson <anders@zeptonic.com>
 * @author    Mattias Tiger <mattias@zeptonic.com>
 * @link      http://www.zeptonic.com
 */
class Former extends Scraper {
	/**
	 * Startpunkt för formning av utseendet hos den skrapade sidan.
	 *
	 * @return Void
	 */
	public function __construct() {
		parent::__construct();
	}
	
	/**
	 * Hanterar utformningen av den skrapade sidan.
	 * Först kontrolleras vilken url som verkligen blivit skrapad och 
	 * beroende på denna anropas rätt funktion för att forma utseendet.
	 *
	 * Om det inte finns formningskod för den skrapade sidan
	 * visas ett felmeddelande och en omdirigering av användaren sker till
	 * söksidan.
	 *
	 * @param String $scrap_url Url som skrapats
	 * @param String $base_url Bas-url, tex http://domain.com
	 * @param String $sid Sessions-id
	 *
	 * @return Void
	 */
	protected function shape_scrap($scrap_url, $base_url, $sid) {
		$scrap_url = strtolower($scrap_url);
		$full_script_path = parse_url($scrap_url, PHP_URL_SCHEME) . "://";
		$full_script_path .= parse_url($scrap_url, PHP_URL_HOST);
		$full_script_path .= parse_url($scrap_url, PHP_URL_PATH);
		$eventtarget = $this->get_eventtarget();
		if($eventtarget == "end" || $eventtarget == "cancel" || $eventtarget == "timecancel") {
			// detta sker då renderingskommando vid post-förfrågningar är "end" eller "cancel"
			// användaren omdirigeras då från bokningssidan till söksidan
			$redirect_url = LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/site/booking/searchteetimes.aspx");
			$content = '<head>';
			$content .= '    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">';
			$content .= '    <meta http-equiv="refresh" content="1;url=' . $redirect_url . '">';
			$content .= '    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
			$content .= '</head>';
			$content .= '<body>';
			$content .= '    Bokningen avslutas. Du omdirigeras tillbaka till <a href="' . $redirect_url . '">söksidan...</a>';
			$content .= '</body>';
			$this->set_html(str_get_html($content));
		} elseif($full_script_path == REMOTE_BASE_URL2 . "/site/booking/searchteetimes.aspx") {
			// formar söksidan
			$this->fix_generic_page($base_url, $sid);
			$this->filter_content();
			$this->fix_logged_in_pages();
			$this->fix_search_page();
		} elseif($full_script_path == REMOTE_BASE_URL2 . "/site/booking/myteetimes.aspx") {
			// formar mina bokningar-sidan
			$this->fix_generic_page($base_url, $sid);
			$this->filter_content();
			$this->fix_logged_in_pages();
			$this->fix_my_bookings_page();
		} elseif($full_script_path == REMOTE_BASE_URL2 . "/site/booking/grid.aspx") {
			// formar kalendersidan
			$this->fix_generic_page($base_url, $sid);
			$this->filter_content();
			$this->fix_logged_in_pages();
			$this->fix_calendar_page();
		} elseif($full_script_path == REMOTE_BASE_URL2 . "/site/booking/window.aspx") {
			// formar bokningssidan
			$this->fix_generic_page($base_url, $sid);
			$this->fix_popup_page($base_url, $sid);
		} elseif($full_script_path == REMOTE_BASE_URL2 . "/site/booking/confirmation.aspx") {
			// formar bekräftelsesidan efter genomförd bokning
			$this->fix_generic_page($base_url, $sid);
			$this->fix_popup_page($base_url, $sid);
			$this->fix_confirm_page($base_url, $sid);
		} elseif($full_script_path == REMOTE_BASE_URL2 . "/login.aspx") {
			// formar loginsidan
			$this->fix_generic_page($base_url, $sid);
			$this->filter_content();
			$this->fix_login_page($base_url);
		} else {
			// omdirigerar användaren till söksidan
			// då en sida efterfrågats som det inte finns formningsrutiner för
			$redirect_url = LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/site/booking/searchteetimes.aspx");
			$content = '<head>';
			$content .= '    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">';
			$content .= '    <meta http-equiv="refresh" content="1;url=' . $redirect_url . '">';
			$content .= '    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
			$content .= '</head>';
			$content .= '<body>';
			$content .= '    Ogiltig URL (' . $scrap_url . '). Du om omdirigeras tillbaka till <a href="' . $redirect_url . '">söksidan...</a>';
			$content .= '</body>';
			$this->set_html(str_get_html($content));
		}
	}
	
	/**
	 * Det generella utformingen som görs på alla sidor.
	 *
	 * @param String $base_url Bas-url, tex http://domain.com
	 * @param String $sid Sessions-id
	 *
	 * @return Void
	 */
	private function fix_generic_page($base_url, $sid) {
		$html = $this->get_html();
		
		// länkarna i översta menyn centreras
		$e = $html->find('div#SubMenu ul li', 1);
		if(isset($e)) {
			$e->style = "margin-left: 50px;";
		}
		
		// länk till "mina starttider", anger mode=render ty avbokningar 
		// görs med post och resultatet av posten måste formas
		$e = $html->find('a[title="Mina starttider"]', 0);
		if(isset($e)) {
			$e->href = $e->href . "&" . POST_RENDER_CMD_KEY . "=" . "deleteTime";
		}
		
		$content = $html->save();
		
		$content = str_replace("nowrap=\"nowrap\"", "", $content);
		// TODO: undersök om raden nedan ska flyttas till logginsidans scrap-funktion
		$content = str_replace("_redirect('http://www.golf.se')", "_redirect('" . LOCAL_BASE_URL . "')", $content);
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformningen för de sidor där man är inloggad.
	 * Fixar utseendet på container med info om den inloggade samt 
	 * fixar utloggningsfunktionalitet.
	 *
	 * @return Void
	 */
	private function fix_logged_in_pages() {
		$html = $this->get_html();
		$e = $html->find("#ctl00_mgHeader_btnLogOff", 0);
		$e1 = $e->parent;
		$e1->style = "width: 80px;";
		
		// logga ut-knapp
		$e = $html->find('#ctl00_mgHeader_btnLogOff', 0);
		$e->style = "margin: 0px;";
		
		// inloggningsinfo
		$e = $html->find('.contentTable', 0);
		$e->style = "border-spacing: 0px;";
		
		$content = $html->save();
		
		// utloggningsfunktionalitet
		$content = str_replace("gbJSON('http://www9.golf.se/Webservices/LoginHandler.ashx?methodName=PlayerOff&callback=?'", "gbJSON('" . LOCAL_BASE_URL . "?" . MODE_KEY . "=" . MODE_VALUE_LOGOUT . "'", $content);
		$content = str_replace("_redirect('http://www.golf.se');", "_redirect('" . LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2) . "');", $content);
		
		// container med info om den inloggade
		$pattern = "/<td >(.*): (.*)<\/td>\s*<td >HCP: (.*)<\/td>\s*<td >Hemmaklubb: (.*)<\/td>/i";
		$replacement = "<td><div style=\"white-space:nowrap;\"><div>$1: $2</div><div>HCP: $3</div><div>Hemmaklubb: $4</div></div></td>";
		$content = preg_replace($pattern, $replacement, $content);
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformningen för söksidan.
	 *
	 * @return Void
	 */
	private function fix_search_page() {
		$html = $this->get_html();
		
		// förhindrar att formuläret skickas utanför ajax-anropet
		$e = $html->find('form', 0);
		$e->onsubmit = "return false;";
		
		// positionerar felmeddelanderutan så den hamnar ovanpå rubriken
		// så att inte övriga layouten störs
		$e = $html->find('#clientErrorContainer', 0);
		$e->style = "position: absolute; top: 90px;";
		
		// radioknappar
		$e = $html->find('input[name="rdoSearchOption"]', 0);
		$e->style = "position: absolute; top: 205px; left: 8px;";
		
		$e = $html->find('label', 0);
		$e->style = "position: absolute; top: 205px; left: 32px;";
		
		$e = $html->find('input[name="rdoSearchOption"]', 1);
		$e->style = "position: absolute; top: 225px; left: 8px;";
		
		$e = $html->find('label', 1);
		$e->style = "position: absolute; top: 225px; left: 32px;";
		
		// sökformulär
		$e = $html->find('table[class="contentTable mgMinusTop"]', 0);
		$e->style = "width: 300px; margin-top: 70px;";
		
		// rubrik för sökformulär "favoritklubbar" 
		$e = $html->find('table[class="contentTable mgMinusTop"] div', 0);
		$e->style = "width: 200px;";
		
		// rubriken "valda klubbar"
		$e = $html->find('table[class="contentTable mgMinusTop"] td', 0);
		$e->style = "margin: 0px; padding: 0px; width: 200px;";
		$e->width = "0%";
		
		// lägg till- och ta bort-knappar
		$e = $html->find('table[class="contentTable mgMinusTop"] button', 0);
		$e->style = "position: absolute; left: 135px; top: 340px; width: 100px;";
		
		$e = $html->find('table[class="contentTable mgMinusTop"] button', 1);
		$e->style = "position: absolute; left: 135px; top: 370px; width: 100px;";
		
		// lista med valda klubbar
		$e = $html->find('table[class="contentTable mgMinusTop"] td', 15);
		$e->style = "position: absolute; left: 200px;";
		
		$e = $html->find('table[class="contentTable mgMinusTop"] td div', 6);
		$e->style = "";
		
		// grön ruta "markera klubb i listan så läggs den till"
		$e = $html->find('table[class="contentTable mgMinusTop"] .mgGreenContentHolder', 0);
		$e->style = "width: 275px;";
		
		// formulär med "antal spelare", "datum" och "klockslag"
		$e = $html->find("table", 9);
		$e->style = "position: absolute; top: 575px; left: 8px;";
		
		// sökknappar
		$e = $html->find("#searchBtns", 0);
		$e->style = "position: relative; top: 200px; margin-bottom: 200px;";
		
		// rubrik för sökresultat
		$e = $html->find("span.headLine", 1);
		$e->style = "position: relative; left: -160px; white-space:nowrap;";
		
		// == kalender med sökresultat ==
		// övre mindre formulär
		$e = $html->find('table[class="contentTable mgMinusTop"]', 2);
		$e->style = "border-spacing: 5px;";
		
		// kalender
		$e = $html->find('table[class="contentTable mgMinusTop"]', 3);
		$e->style = "border-spacing: 0px; width: 300px;";
		$e->width = "";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_A_ClubGrid', 0);
		$e->style = "width: 298px; margin-top: 50px;";
		
		// förklaringar under kalender
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_A_ClubGridLegend', 0);
		$e->style = "width: 100px;";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_A_ClubGridInfo', 0);
		$e->style = "width: 300px; padding: 0px; margin: 0px;";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_A_ClubWebPayment', 0);
		$e->style = "width: 300px; padding: 0px; margin: 0px;";
		
		// tar bort paketreklam
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_A_ClubGolfPackage', 0);
		$e->style = "display: none;";
		
		// kalender
		$e = $html->find('#clubGrid_B table[class="contentTable mgMinusTop"]', 1);
		$e->style = "border-spacing: 0px; width: 300px;";
		$e->width = "";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_B_ClubGrid', 0);
		$e->style = "width: 298px; margin-top: 50px;";
		
		// förklaringar under kalender
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_B_ClubGridLegend', 0);
		$e->style = "width: 100px;";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_B_ClubGridInfo', 0);
		$e->style = "padding: 0px; margin: 0px; width: 300px;";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_B_ClubWebPayment', 0);
		$e->style = "width: 300px; padding: 0px; margin: 0px;";
		
		// tar bort paketreklam
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_B_ClubGolfPackage', 0);
		$e->style = "display: none;";
		
		$content = $html->save();
		
		// bryter upp övre formuläret så delarna får separata rader
		$pattern = "/<\/td>\s*<td>Klubb:<\/td>/i";
		$replacement = "<td></tr><tr><td></td><td width=\"30%\">Klubb:</td>";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = "/<\/td>\s*<td>Bana:<\/td>/i";
		$replacement = "<td></tr><tr><td></td><td>Bana:</td>";
		$content = preg_replace($pattern, $replacement, $content);
		
		// bryter upp ikon-informationen under så det blir tre rader
		$content = str_replace('<td >Bokad</td>', '<td>Bokad</td></tr><tr>', $content);
		$content = str_replace('<td >Ej webbokning</td>', '<td colspan="2">Ej webbokning</td></tr><tr>', $content);
		$content = str_replace('<td >Kvinna</td>', '<td colspan="2">Kvinna</td>', $content);
		$content = str_replace('<td><div class="bookingIcon bookingFree"></div></td>', '<td></td><td><div class="bookingIcon bookingFree"></div></td>', $content);
		// == slut kalender med sökresultat ==
		

		// TODO: ta bort?
		$content = str_replace('<img src="/Images/', '<img src="' . REMOTE_BASE_URL2 . '/Images/', $content); // adjust tag paths borde ta detta
		

		// bryter rubrik ("sök resultat") och formulär till olika rader
		$content = str_replace("resultat</span></td>", "resultat</span></td></tr><tr>", $content);
		
		// bryter sökresultatet så alla resultat har separata rader
		$content = str_replace("<td><div class=\"space\"></div></td>", "<td><div class=\"space\"></div></td></tr><tr>", $content);
		
		// sökresultatet ska spänna ut så mycket det kan
		$content = str_replace('width="50%"', '', $content);
		
		// sökfunktionalitet
		$content = str_replace("gbPOST('http://www9.golf.se/Webservices/BookingHandler.ashx?methodName=GetStartTimes'", "gbPOST('" . LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/Webservices/BookingHandler.ashx?methodName=GetStartTimes") . "'", $content);
		
		// fixar länk till kalendern i resultatet
		$pattern = "var gridLinks = 'Grid.aspx?clubid=' + vCourse.ClubID + '&courseid=' + vCourse.CourseID + '&date=' + date + 'T000000';";
		$replacement = "var gridLinks = '" . LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/Site/Booking/") . "Grid.aspx%3Fclubid=' + vCourse.ClubID + '%26courseid=' + vCourse.CourseID + '%26date=' + date + 'T000000';";
		$content = str_replace($pattern, $replacement, $content);
		
		$this->set_html(str_get_html($content));
	}
	
	private function fix_my_bookings_page() {
		$html = $this->get_html();
		
		// tabellen för bokningslistan får 2px marginal till höger
		$e = $html->find('.mgBigContentHolder', 0);
		$e->style = "margin-right: 2px;";
		
		// trycker ihop tabellen med bokningslistan
		$tags = $html->find('table[class="contentTable mgMinusTop"]');
		foreach($tags as $tag) {
			$tag->style = "border-spacing: 4px;";
		}
		
		// trycker ihop alla tabellceller i bokningslistan
		$tags = $html->find('table[class="contentTable mgMinusTop"] td');
		foreach($tags as $tag) {
			$tag->style = "padding: 1px; margin: 0px; text-align: center;";
		}
		
		// tar bort den sista tabellcellen i headern för varje bokning
		$c = 1;
		$tags = $html->find('.trHeader td');
		foreach($tags as $tag) {
			if($c % 8 == 0) {
				$tag->style = "display: none;";
			}
			$c++;
		}
		
		// tar bort bordern till vänster så det matchar till höger för varje bokning
		$tags = $html->find('.leftBorder');
		foreach($tags as $tag) {
			$tag->class = "";
		}
		
		// tar bort tabellcellen till höger för varje bokning, 
		// visar bara en ikon som tar upp plats
		$tags = $html->find('.rightBorder');
		foreach($tags as $tag) {
			$tag->innertext = "";
			$tag->style = "display: none;";
		}
		
		$content = $html->save();
		
		// klock-ikon och rubrik med datum och tid för varje bokning
		// får en egen rad
		$pattern = '/<td style="font-size: 11px">\s*<table border="0" cellpadding="0" cellspacing="0">/ims';
		$replacement = '</tr><tr><td><table>';
		$content = preg_replace($pattern, $replacement, $content);
		
		// klock-ikon och rubrik med datum och tid görs till en tabellcell
		$pattern = '/<\/td>\s*<td\s*width="100%">\s*<span\s*class="headLine">/ims';
		$replacement = '<span class="headLine">';
		$content = preg_replace($pattern, $replacement, $content);
		
		// klock-ikonen får utrymme till höger om rubrik med datum och tid samt 
		// blir positionerad i mitten i förhållande till rubriken i vertikalt led
		$pattern = '<img src="http://www9.golf.se/Images/ico_portlet_time_white.gif"';
		$replacement = '<img style="vertical-align: middle; margin-right: 20px;" src="http://www9.golf.se/Images/ico_portlet_time_white.gif"';
		$content = str_replace($pattern, $replacement, $content);
		
		// tar bort div med fixerade storlekar i tabellcellerna för att 
		// minimera tabellen med bokningar
		$pattern = '/<div style="width:\s*\d*px">([^>]*)<\/div>/ims';
		$replacement = '$1';
		$content = preg_replace($pattern, $replacement, $content);
		
		// tar bort redigera länkar med tillhörande ikon och dess utgråade version
		$pattern = "<b>Redigera</b>";
		$replacement = "";
		$content = str_replace($pattern, $replacement, $content);
		
		$pattern = '/<img\s*src="[^"]*ico_edit_big_deact_white\.gif"[^>]*>/';
		$replacement = "";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = '/<img\s*src="[^"]*ico_edit_big_act_white\.gif"[^>]*>/';
		$replacement = "";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = "_redirect('SearchTeeTimes.aspx')";
		$replacement = "_redirect('" . LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/Site/Booking/SearchTeeTimes.aspx") . "')";
		$content = str_replace($pattern, $replacement, $content);
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformningen för kalendersidan.
	 *
	 * @return Void
	 */
	private function fix_calendar_page() {
		$html = $this->get_html();
		
		// övre mindre formulär
		$e = $html->find('table[class="contentTable mgMinusTop"]', 0);
		$e->style = "border-spacing: 5px;";
		
		// kalender
		$e = $html->find('table[class="contentTable mgMinusTop"]', 1);
		$e->style = "border-spacing: 0px;";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_ClubGrid', 0);
		$e->style = "width: 298px; margin-top: 30px;";
		
		// förklaringar under kalender
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_ClubGridLegend', 0);
		$e->style = "width: 100px;";
		
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_ClubGridInfo', 0);
		$e->style = "padding: 10px;";
		
		// tar bort paketreklam
		$e = $html->find('#ctl00_mainContent_mgPortletClubGrid_ClubGolfPackage', 0);
		$e->style = "display: none";
		
		$content = $html->save();
		
		// bryter upp övre formuläret så delarna får separata rader
		$pattern = "/<\/td>\s*<td>Klubb:<\/td>/i";
		$replacement = "<td></tr><tr><td></td><td width=\"30%\">Klubb:</td>";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = "/<\/td>\s*<td>Bana:<\/td>/i";
		$replacement = "<td></tr><tr><td></td><td>Bana:</td>";
		$content = preg_replace($pattern, $replacement, $content);
		
		// bryter upp ikon-informationen under så det blir tre rader
		$content = str_replace('<td >Bokad</td>', '<td>Bokad</td></tr><tr>', $content);
		$content = str_replace('<td >Ej webbokning</td>', '<td colspan="2">Ej webbokning</td></tr><tr>', $content);
		$content = str_replace('<td >Kvinna</td>', '<td colspan="2">Kvinna</td>', $content);
		$content = str_replace('<td><div class="bookingIcon bookingFree"></div></td>', '<td></td><td><div class="bookingIcon bookingFree"></div></td>', $content);
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformningen av popup-sidor.
	 *
	 * @param String $base_url Bas-url, tex http://domain.com
	 * @param String $sid Sessions-id
	 *
	 * @return Void
	 */
	private function fix_popup_page($base_url, $sid) {
		$html = $this->get_html();
		
		$e = $html->find('body', 0);
		$e->style = "background: #fff;";
		
		// gömmer sök-knappen
		$e = $html->find('#ctl00_bottomContent_cmdSearch', 0);
		if(isset($e)) {
			$e->style = "display: none";
		}
		
		// trycker ihop alla tabellceller
		$tags = $html->find('.mgListTable td');
		foreach($tags as $tag) {
			$tag->style = "padding-left: 0px; padding-right: 1px; margin: 0px;";
		}
		
		// minskar den stora tabellen med formuläret
		$e = $html->find('.mgBigContentHolder', 0);
		$e->style = "width: 300px;";
		
		$e = $html->find('.mgBigContentHolder table', 0);
		$e->width = "";
		
		$e = $html->find('#clientErrorContainer', 0);
		$e->style = "width: 300px;";
		
		// snyggar till tabellen med bokingsinfo
		$tags = $html->find("table");
		foreach($tags as $tag) {
			$tag->style = $tag->style . "border-spacing: 1px; width: 300px;";
		}
		
		$e = $html->find('.contentTable', 0);
		$e->style = $e->style . "margin-bottom: 10px;";
		
		$e = $html->find('table[class="contentTable mgMinusTop"]', 0);
		$e->style = $e->style . "margin-bottom: 10px;";
		
		$e = $html->find("#tabcontent", 0);
		$table_exist = isset($e);
		if($table_exist) {
			$e->style = "width: 510px; border: none; margin: 0px;";
			
			$e = $html->find("#tabcontent .contentTable", 0);
			$e->style = "border-spacing: 0px;";
			
			// borden under tabbarna blir 510px bred
			// precis som tabellen under är
			$e = $html->find('#tabnav', 0);
			$e->style = "width: 510px; margin: 0px;";
			
			// tar bort en tabell-rubrik
			$e = $html->find('div[title="Betala hela beloppet nu"]', 0);
			$e->style = "display: none;";
			
			// komprimerar formulär-tabellen
			$tags = $html->find("#tabcontent div");
			foreach($tags as $tag) {
				$tag->style = "margin: 0px; padding: 0px;";
			}
			
			// tabellceller komprimeras
			$tags = $html->find("#tabcontent .contentTable td");
			foreach($tags as $tag) {
				$tag->style = "margin: 0px; padding-left: 0px;padding-right: 2px;";
			}
			
			// tabellrubriker komprimeras
			$tags = $html->find("#tbl_overview .trClear td");
			foreach($tags as $tag) {
				$tag->style = "width: 0px; margin: 0px; padding 0px;";
			}
			
			$tags = $html->find(".mgEllipsis");
			foreach($tags as $tag) {
				$tag->style = "";
			}
		}
		
		$content = $html->save();
		
		// tar bort köpinformationen
		$pattern = '/<img\s*src="[^"]*ico_portlet_info_white\.gif"[^>]*>/';
		$replacement = "";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = 'Köpinformation från Golfklubben';
		$replacement = '';
		$content = str_replace($pattern, $replacement, $content);
		
		$pattern = 'Läs köpinformation här';
		$replacement = '';
		$content = str_replace($pattern, $replacement, $content);
		
		// tar bort alla width=100%
		$pattern = 'width="100%"';
		$replacement = '';
		$content = str_replace($pattern, $replacement, $content);
		
		if($table_exist) {
			// skrollar formulärtabellen
			$pattern = '/<!-- Start new mode -->(.*?)<!-- End new mode -->/ims';
			preg_match($pattern, $content, $matches);
			$table = $matches[0];
			$div_tag_scroll_start = '<div style="overflow: scroll;width: 300px; padding-top: 5px;">';
			$div_tag_scroll_end = '</div>';
			$table_scroll = $div_tag_scroll_start . $table . $div_tag_scroll_end;
			$pos_table_start = strpos($content, $table);
			$pos_table_end = $pos_table_start + strlen($table);
			//$content = substr($content, 0, $pos_table_start) . $table_scroll . substr($content, $pos_table_end, strlen($content));
		}
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformningen av bekräftelsesidan efter bokning är klar.
	 *
	 * @param String $base_url Bas-url, tex http://domain.com
	 * @param String $sid Sessions-id
	 *
	 * @return Void
	 */
	private function fix_confirm_page($base_url, $sid) {
		$html = $this->get_html();
		
		// trycker ihop alla tabellceller
		$tags = $html->find('.mgListTable td');
		foreach($tags as $tag) {
			$tag->style = "padding-right: 1px; padding-left: 0px; margin: 0px;";
		}
		
		// gömmer skriv ut-knappen
		$e = $html->find('#ctl00_bottomContent_cmdPrint', 0);
		$e->style = "display: none";
		
		// gömmer avboka-knappen
		$e = $html->find('#ctl00_bottomContent_cmdDelete', 0);
		$e->style = "display: none";
		
		$content = $html->save();
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformningen av loginsidan.
	 *
	 * @param String $base_url Bas-url tex http://domain.com
	 *
	 * @return Void
	 */
	private function fix_login_page($base_url) {
		// tar bort onödiga länkar till exempel "glömt lösenord"
		$this->kill_tag('#MinGolfLoginForm a', 0);
		$this->kill_tag('#MinGolfLoginForm a', 1);
		$this->kill_tag('#MinGolfLoginForm a', 2);
		$this->kill_tag('#MinGolfLoginForm a', 3);
		
		$html = $this->get_html();
		
		// förhindrar att formuläret skickas utanför ajax-anropet
		$e = $html->find('form', 0);
		$e->onsubmit = "return false;";
		
		// positionerar eror-containern rätt och anpassar dess storlek
		$e = $html->find("#loginError", 0);
		$e->class = $e->class . " ui-state-error";
		$e->style = "position:absolute; top: 100px; left: 10px; margin-bottom: 300px; width: 270px; padding: 5px;";
		
		// loginformuläret anpassas
		$e = $html->find("#MinGolfLoginForm", 0);
		$e->style = "height: 160px;";
		
		$e = $html->find("#MinGolfLoginForm .hspace", 0);
		$e->style = "display: none;";
		
		$tags = $html->find("#MinGolfLoginForm br");
		foreach($tags as $tag) {
			$tag->style = "display: none;";
		}
		
		// regeln i formulärets gråa område tas bort
		$e = $html->find("#MinGolfLoginForm hr", 0);
		$e->style = "display: none;";
		
		// rutan som visas när man loggar in anpassas
		$e = $html->find("#inlineLogin", 0);
		$e->style = $e->style . "; width: 200px";
		
		$e = $html->find("#inlineLogin table", 0);
		$e->width = "";
		
		$content = $html->save();
		
		// inloggningsfunktionalitet
		$requested_url = $this->get_parsing_url();
		$content = str_replace("gbJSON('http://www9.golf.se/Webservices/LoginHandler.ashx?methodName=Player&callback=?'", "gbJSON('" . LOCAL_BASE_URL . "?" . MODE_KEY . "=" . MODE_VALUE_LOGIN . "&methodName=Player&callback=?'", $content);
		$content = preg_replace("/(_redirect\('http:\/\/www9\.golf\.se\/.*?'\);)/", "_redirect('" . LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode($requested_url) . "');", $content);
		
		// felmeddelanderutan anpassas
		$pattern = "jQuery('#loginError').removeClass('hidden');";
		$replacement = $pattern . "jQuery('#MinGolfLoginForm').attr('style', 'margin-top: 230px;');";
		$content = str_replace($pattern, $replacement, $content);
		
		$pattern = "jQuery('#loginError').addClass('hidden');";
		$replacement = $pattern . "jQuery('#MinGolfLoginForm').attr('style', 'margin-top: 0px;');";
		$content = str_replace($pattern, $replacement, $content);
		
		$this->set_html(str_get_html($content));
	}
	
	/**
	 * Utformning av sidornas css-kod.
	 *
	 * @param String $content Innehåll i en css-fil 
	 *
	 * @return String
	 */
	protected function shape_scrap_css($content) {
		$css_parser = new css_parser();
		$css_parser->load($content);
		
		// == generellt ==
		// tar bort vissa attribut
		$css_parser->remove_attribute("body", "background-image");
		$css_parser->remove_attribute("#Wrapper", "background-img");
		$css_parser->remove_attribute(".mgEllipsis", "white-space");
		
		// försöker tvinga in allt på 320px
		$css_parser->set_all_attribute_less_than("width", "320px");
		
		// generell formning av alla sidor genom de generellt förekommande containrarna
		$css_parser->set("body", "margin", "0px");
		$css_parser->set("body", "width", "300px");
		$css_parser->set("body", "font-size", "11px");
		$css_parser->set("body", "background-color", "#FFF");
		$css_parser->set("#Wrapper", "width", "320px");
		$css_parser->set("div.menuWrapper", "width", "310px");
		$css_parser->set("div.menuWrapper", "padding", "0px 0px 0px 10px");
		$css_parser->set("#LeftAndCenterWrapper", "margin", "0px 0px 0px 0px");
		$css_parser->set("#LeftAndCenterWrapper", "width", "300px");
		$css_parser->set("#MainContent", "width", "300px");
		$css_parser->set("#MainContent", "padding", "0px 0px 0px 20px");
		$css_parser->set("#Content", "width", "300px");
		$css_parser->set("#Sheet", "width", "320px");
		
		// formar generellt tabeller
		$css_parser->set("td", "font-size", "11px");
		$css_parser->set("td", "padding-left", "0px");
		$css_parser->set("td", "margin-left", "0px");
		$css_parser->set("tr", "padding-left", "0px");
		$css_parser->set("tr", "margin-left", "0px");
		$css_parser->set("table", "font-size", "11px");
		$css_parser->set("table", "padding-left", "0px");
		$css_parser->set("table", "margin-left", "0px");
		$css_parser->set("input", "font-size", "10px");
		
		// formar generellt select-fält
		$css_parser->set("select", "font-size", "10px");
		$css_parser->set("select", "width", "100px");
		
		// == globala element ==
		// top meny (sök starttid, boka på hemmaklubb, mina starttider)
		$css_parser->set("#SubMenu", "width", "308px");
		$css_parser->set("#SubMenu ul li", "margin-left", "5px");
		$css_parser->set("#SubMenu ul li", "padding-left", "0px");
		$css_parser->set("#SubMenu ul li", "padding-right", "15px");
		
		// inloggningsinfo och utloggningsknapp
		$css_parser->set(".mgBigContentHolder", "border", "0px");
		$css_parser->set(".trHeader span", "white-space", "nowrap");
		
		// positionerar utloggningknapp
		$css_parser->set("#ctl00_mgHeader_btnLogOff", "margin-right", "15px");
		$css_parser->set("#ctl00_mgHeader_btnLogOff", "margin-top", "5px");
		
		// info med inloggninginfo, utloggningsknapp och rubrik på inloggningssidan
		$css_parser->set(".mgGreenContentHolder", "width", "296px");
		
		// == lokala element ==
		// inloggningsformulärsrutan
		$css_parser->set("#MinGolfLoginForm", "width", "180px");
		$css_parser->set("#MinGolfLoginForm", "margin-left", "45px");
		
		// felmeddelandrutan vid inlogg
		$css_parser->set(".ui-state-error", "width", "282px");
		
		// klubbväljar-formulär på söksidan
		$css_parser->set("#favClubSelectable", "width", "100px");
		$css_parser->set("#clubSearchSelectable", "width", "100px");
		
		// lägg till / ta bort knappar på söksidan
		$css_parser->set("#ctl00_mainContent_cmdClubAdd", "margin-left", "-37px");
		$css_parser->set("#ctl00_mainContent_cmdClubRemove", "margin-left", "-38px");
		$css_parser->set(".btnGreen29", "margin-right", "-8px");
		$css_parser->set("#favClubSelectable", "width", "92px");
		$css_parser->set("#clubSearchSelectable", "width", "92px");
		
		// datum-popupen göms när den är inaktiv på kalendrar
		$css_parser->set("#ui-datepicker-div", "display", "none");
		
		$content = $css_parser->save();
		return $content;
	}
	
	/**
	 * Utformning av sidornas javascript-kod.
	 *
	 * @param String $content Innehåll i en javascript-fil 
	 *
	 * @return String
	 */
	protected function shape_scrap_javascript($content) {
		// kalendrarnas mouse-over fönster tas bort
		$pattern = "/onmousemove=\\\\\"(.*?)\\\\\"/i";
		$replacement = "";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = "/onmouseout=\\\\\"(.*?)\\\\\"/i";
		$replacement = "";
		$content = preg_replace($pattern, $replacement, $content);
		
		$pattern = "/gbPOST\('([^']*)'/i";
		$replacement = "gbPOST('" . LOCAL_BASE_URL . "?" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/Webservices/BookingHandlerV2.ashx?methodName=LockTimerTick") . "'";
		$content = preg_replace($pattern, $replacement, $content);
		
		// går till bokningssidan ist för att öppna den som en popup-ruta
		$pattern = "var bw = window.open('http://www9.golf.se/Site/Booking/Jump.aspx' + link.join('&'), 'bookingWindow', settings);";
		$replacement = "window.location = '" . LOCAL_BASE_URL . "?" . POST_RENDER_CMD_KEY . "=" . "book,end,cancel,timeCancel" . "&" . URL_KEY . "=" . urlencode(REMOTE_BASE_URL2 . "/Site/Booking/Jump.aspx?") . "' + link.join('%26');";
		$content = str_replace($pattern, $replacement, $content);
		
        // när fel uppstår vid ajax-sidförfrågning
        // visas en info-ruta och sidan laddas sedan om för att
        // avhjälpa felet och att en ny förfrågan kan göras
		$pattern = ".error(function(jqXHR, textStatus, errorThrown) {";
		$replacement = ".error(function(jqXHR, textStatus, errorThrown) {";
		$replacement .= "alert('Okänt fel vid sidförfrågan.');";
		$replacement .= "window.location = '" . Url_handler::current_url() . "';";
		$replacement .= "return;";
		$content = str_replace($pattern, $replacement, $content);
		
		return $content;
	}
	
	/**
	 * Tar bort stora delar av sidan så bara huvudinnehållet syns.
	 *
	 * @return Void
	 */
	private function filter_content() {
		$this->kill_tag('div#LeftMenu');
		$this->kill_tag('ul.topMenu');
		
		$this->kill_tag('div#MenuLeft');
		$this->kill_tag('div#MenuRight');
		$this->kill_tag('div#MenuBorder');
		
		$this->kill_tag('div#SubMenu ul li', 0);
		$this->kill_tag('div#SubMenu ul li', 2);
		$this->kill_tag('div#SubMenu ul li', 4);
		$this->kill_tag('div#SubMenu ul li', 5);
		$this->kill_tag('div#SubMenu ul li', 6);
		$this->kill_tag('div#SubMenu ul li', 7);
		
		$this->kill_tag('div#TopBanner');
		$this->kill_tag('div#Header');
		$this->kill_tag('div.menu');
		$this->kill_tag('div#RightContent');
		$this->kill_tag('div#Footer');
		$this->kill_tag('div#PartnerHeader');
		$this->kill_tag('div.sc_menu');
	}
	
	/**
	 * Gör ett element osynligt.
	 * Id, namn och class tas bort så de inte kan adresseras via css.
	 * Dessutom läggs css till så den blir osynlig genom display:none.
	 *
	 * @param String $id Identifierare av ett element
	 * @param Integer $idx Index om fler element hittas
	 *
	 * @return Void
	 */
	private function kill_tag($id, $idx = 0) {
		$html = $this->get_html();
		$e = $html->find($id, $idx);
		$e->innertext = "";
		if(isset($e->class)) {
			$e->class = "";
		}
		if(isset($e->name)) {
			$e->name = "";
		}
		if(isset($e->style)) {
			$e->style = "display: none;";
		}
		if(isset($e->id)) {
			$e->id = "";
		}
		if(isset($e->width)) {
			$e->width = "";
		}
	}
}
?>